/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.cliente.usuario.vista;

import co.com.entities.Empresa;
import co.com.entities.TipoDocumento;
import co.com.entities.Universidad;
import co.com.entities.Usuario;
import co.com.client.BaseView.CreateBase;
import co.com.cliente.Services;
import co.com.cliente.empresa.estructura.EmpresaDS;
import co.com.cliente.empresa.estructura.EmpresaRecord;
import co.com.cliente.tipoDocumento.estructura.TipoDocumentoDS;
import co.com.cliente.tipoDocumento.estructura.TipoDocumentoRecord;
import co.com.cliente.universidad.estructura.UniversidadDS;
import co.com.cliente.universidad.estructura.UniversidadRecord;
import co.com.cliente.usuario.estructura.UsuarioDS;
import co.com.cliente.usuario.estructura.UsuarioRecord;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.SelectionAppearance;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.DateItem;
import com.smartgwt.client.widgets.form.fields.PasswordItem;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.RecordDoubleClickEvent;
import com.smartgwt.client.widgets.grid.events.RecordDoubleClickHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author dloaiza
 */
public class UsuarioEditor extends CreateBase {

    private Usuario usuario;
    private HLayout accionesUsuario;
    private DynamicForm frmUsuario;
    private TextItem txtdocumento, txtnombres, txtapellido1, txtapellid2, txttelefonoFijo, txtcelular, txtcorreo;
    private PasswordItem txtcontrasena;
    private Button btnGuardar, btnLimpiar, btnEliminar;
    private DateItem dtpfechaNacimiento;
    private SelectItem cbxuniversidad, cbxempresa, cbxtipoDocumento;
    private ListGrid usuarioGrid;
    private UniversidadDS universidadDs;
    private TipoDocumentoDS tipoDocumentoDs;
    private EmpresaDS empresaDs;

    public UsuarioEditor() {
        super("Creación de Usuario", "100%");
        initComponents();
    }

    private void initComponents() {

        universidadDs = new UniversidadDS();
        tipoDocumentoDs = new TipoDocumentoDS();
        empresaDs = new EmpresaDS();
        txtdocumento = new TextItem();
        txtdocumento.setTitle("Identificación");
        txtdocumento.setWidth(200);
        txtdocumento.setRequired(true);
        txtdocumento.setName("txtdocumento");
        txtdocumento.setLength(20);
        txtdocumento.setAlign(Alignment.LEFT);
        txtdocumento.setWrapTitle(false);

        txtnombres = new TextItem();
        txtnombres.setTitle("Nombres");
        txtnombres.setWidth(200);
        txtnombres.setRequired(true);
        txtnombres.setName("txtnombres");
        txtnombres.setLength(130);
        txtnombres.setAlign(Alignment.LEFT);
        txtnombres.setWrapTitle(false);

        txtapellido1 = new TextItem();
        txtapellido1.setTitle("Apellido 1");
        txtapellido1.setWidth(200);
        txtapellido1.setRequired(true);
        txtapellido1.setName("txtapellido1");
        txtapellido1.setLength(50);
        txtapellido1.setAlign(Alignment.LEFT);
        txtapellido1.setWrapTitle(false);

        txtapellid2 = new TextItem();
        txtapellid2.setTitle("Apellid 2");
        txtapellid2.setWidth(200);
        txtapellid2.setName("txtapellid2");
        txtapellid2.setLength(50);
        txtapellid2.setAlign(Alignment.LEFT);
        txtapellid2.setWrapTitle(false);

        txttelefonoFijo = new TextItem();
        txttelefonoFijo.setTitle("Teléfono fijo");
        txttelefonoFijo.setWidth(200);
        txttelefonoFijo.setRequired(true);
        txttelefonoFijo.setName("txttelefonoFijo");
        txttelefonoFijo.setLength(10);
        txttelefonoFijo.setAlign(Alignment.LEFT);
        txttelefonoFijo.setWrapTitle(false);

        txtcelular = new TextItem();
        txtcelular.setTitle("Celular");
        txtcelular.setWidth(200);
        txtcelular.setName("txtcelular");
        txtcelular.setLength(15);
        txtcelular.setAlign(Alignment.LEFT);
        txtcelular.setWrapTitle(false);

        txtcorreo = new TextItem();
        txtcorreo.setTitle("Email");
        txtcorreo.setWidth(200);
        txtcorreo.setRequired(true);
        txtcorreo.setName("txtcorreo");
        txtcorreo.setLength(250);
        txtcorreo.setAlign(Alignment.LEFT);
        txtcorreo.setWrapTitle(false);

        txtcontrasena = new PasswordItem();
        txtcontrasena.setTitle("Contraseña");
        txtcontrasena.setWidth(200);
        txtcontrasena.setRequired(true);
        txtcontrasena.setName("txtcontrasena");
        txtcontrasena.setLength(110);
        txtcontrasena.setAlign(Alignment.LEFT);
        txtcontrasena.setWrapTitle(false);



        btnGuardar = new Button("Guardar");

        btnLimpiar = new Button("Limpiar");

        btnEliminar = new Button("Eliminar");



        dtpfechaNacimiento = new DateItem();
        dtpfechaNacimiento.setTitle("Fecha nacimiento");
        dtpfechaNacimiento.setWidth(200);
        dtpfechaNacimiento.setName("dtpfechaNacimiento");
        dtpfechaNacimiento.setUseTextField(true);
        dtpfechaNacimiento.setAlign(Alignment.LEFT);
        dtpfechaNacimiento.setWrapTitle(false);


        cbxuniversidad = new SelectItem();
        cbxuniversidad.setTitle("Universidad");
        cbxuniversidad.setName("cbxuniversidad");
        cbxuniversidad.setWidth(200);
        cbxuniversidad.setDisplayField(UniversidadDS.DSNOMBRE);
        cbxuniversidad.setValueField(UniversidadDS.DSNOMBRE);
        cbxuniversidad.setAlign(Alignment.LEFT);
        cbxuniversidad.setWrapTitle(false);
        
        cbxempresa = new SelectItem();
        cbxempresa.setTitle("Empresa");
        cbxempresa.setName("cbxempresa");
        cbxempresa.setWidth(200);
        cbxempresa.setDisplayField(EmpresaDS.DSRAZONSOCIAL);
        cbxempresa.setValueField(EmpresaDS.DSNIT);
        cbxempresa.setAlign(Alignment.LEFT);
        cbxempresa.setWrapTitle(false);

        cbxtipoDocumento = new SelectItem();
        cbxtipoDocumento.setTitle("Tipo documento");
        cbxtipoDocumento.setName("cbxtipoDocumento");
        cbxtipoDocumento.setRequired(true);
        cbxtipoDocumento.setWidth(200);
        cbxtipoDocumento.setDisplayField(TipoDocumentoDS.DSTIPOIDENTIFICACION);
        cbxtipoDocumento.setValueField(TipoDocumentoDS.DSTIPOIDENTIFICACION);
        cbxtipoDocumento.setAlign(Alignment.LEFT);
        cbxtipoDocumento.setWrapTitle(false);

        usuarioGrid = new ListGrid();
        usuarioGrid.setWidth100();
        usuarioGrid.setHeight100();
        usuarioGrid.setDataSource(new UsuarioDS());
        usuarioGrid.setAutoFetchData(true);
        usuarioGrid.setFields(UsuarioRecord.getFields());
        usuarioGrid.setEmptyMessage("No hay registros para mostrar");
        usuarioGrid.setSelectionType(SelectionStyle.SIMPLE);
        usuarioGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
        usuarioGrid.setFilterOnKeypress(true);
        usuarioGrid.setShowFilterEditor(true);
        usuarioGrid.addRecordDoubleClickHandler(new RecordDoubleClickHandler() {
            @Override
            public void onRecordDoubleClick(RecordDoubleClickEvent event) {
                usuario = (Usuario) event.getRecord().getAttributeAsObject("Usuario");
                dtpfechaNacimiento.setValue(usuario.getFefehchaNacimiento());
                cbxuniversidad.setValue(usuario.getNmidUniversidad() == null ? "" : usuario.getNmidUniversidad().getDsnombre());
                cbxempresa.setValue(usuario.getDsidEmpresa() == null ? "" : usuario.getDsidEmpresa().getDsnit());
                cbxtipoDocumento.setValue(usuario.getDsidTipoDocumento() == null ? "" : usuario.getDsidTipoDocumento().getDstipoDocumento());
                txtdocumento.setValue(usuario.getNmdocumento());
                txtnombres.setValue(usuario.getDsnombres());
                txtapellido1.setValue(usuario.getDsapellido1());
                txtapellid2.setValue(usuario.getDsapellido2() == null ? "" : usuario.getDsapellido2());
                txttelefonoFijo.setValue(usuario.getDstelefonoFijo() == null ? "" : usuario.getDstelefonoFijo());
                txtcelular.setValue(usuario.getDstelefonoCelular() == null ? "" : usuario.getDstelefonoCelular());
                txtcorreo.setValue(usuario.getDscorreo() == null ? "" : usuario.getDscorreo());
                txtcontrasena.setValue(usuario.getDscontrasena() == null ? "" : usuario.getDscontrasena());
                txtdocumento.setDisabled(true);
            }
        });


        accionesUsuario = new HLayout();
        accionesUsuario.setMargin(20);
        accionesUsuario.setMembersMargin(20);
        accionesUsuario.setHeight(50);
        accionesUsuario.setWidth("100%");
        accionesUsuario.setAlign(Alignment.CENTER);
        accionesUsuario.setMembers(btnGuardar, btnLimpiar, btnEliminar);

        frmUsuario = new DynamicForm();
        frmUsuario.setNumCols(4);
        frmUsuario.setItems(txtdocumento, txtnombres, txtapellido1, txtapellid2, txttelefonoFijo, txtcelular, txtcorreo, txtcontrasena, dtpfechaNacimiento, cbxuniversidad, cbxempresa, cbxtipoDocumento);

        AddActionBarItem(accionesUsuario);
        VLayout contenedor = new VLayout();
        contenedor.setMembers(frmUsuario, usuarioGrid);
        AddFormContainerItem(contenedor);

        btnGuardar.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                if (frmUsuario.validate()) {
                    if (dtpfechaNacimiento.getValueAsDate().getDate() == new Date().getDate() || dtpfechaNacimiento.getValueAsDate().after(new Date())) {
                        SC.say("Señor usuario, la fecha de nacimiento debe ser menor a la actual");
                    } else {
                        if (usuario == null) {
                            Services.getUsuarioServices().guardarUsuario(getUsuario(), new AsyncCallback<Void>() {
                                public void onFailure(Throwable caught) {
                                    SC.say("Error en creación de usuario", caught.getMessage());
                                }

                                public void onSuccess(Void result) {
                                    SC.say("Creación de usuario", "Señor usuario, el usuario fue registrado correctamente");
                                    usuariosLoad();
                                }
                            });
                        } else {
                            Services.getUsuarioServices().actualizarUsuario(getUsuario(), new AsyncCallback<Void>() {
                                public void onFailure(Throwable caught) {
                                    SC.say("Error en actualización de usuario", caught.getMessage());
                                }

                                public void onSuccess(Void result) {
                                    SC.say("Actualización de usuario", "Señor usuario, el usuario fue actualizado correctamente");
                                    usuariosLoad();
                                }
                            });
                        }

                    }

                }
            }
        });
        btnLimpiar.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                frmUsuario.clearValues();
                txtdocumento.setDisabled(false);
            }
        });
        btnEliminar.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                ListGridRecord[] selectedRecords = usuarioGrid.getSelection();
                final List<Usuario> usuariosToDelete = new ArrayList<Usuario>(selectedRecords.length);


                for (ListGridRecord rec : selectedRecords) {
                    usuariosToDelete.add((Usuario) rec.getAttributeAsObject("Usuario"));
                }
                if (usuariosToDelete.isEmpty()) {

                    SC.warn("Debe seleccionar al menos un usuario para poder eliminar");
                    return;
                } else {
                    SC.confirm("Confirmar Eliminación", "¿Esta seguro que desea eliminar los usuarios seleccionadas?", new BooleanCallback() {
                        @Override
                        public void execute(Boolean value) {
                            if (value) {
                                AsyncCallback<Void> updateStateCallback = new AsyncCallback<Void>() {
                                    @Override
                                    public void onFailure(Throwable caught) {
                                        Logger.getLogger(getClass().getName()).log(Level.INFO, "Mensaje informativo... no se pudo eliminar el producto debido a: " + caught.getMessage());
                                        SC.say("Eliminación de usuario", caught.getMessage());
                                    }

                                    @Override
                                    public void onSuccess(Void result) {
                                        SC.say("Eliminación de usuario", "Señor usuario, el(los) usuario(s) se han eliminado correctamente");
                                        usuariosLoad();
                                    }
                                };
                                Services.getUsuarioServices().eliminarUsuarios(usuariosToDelete, updateStateCallback);
                            }
                        }
                    });
                }
            }
        });
        cargarEmpresas();
        cargarTipoDocumento();
        cargarUniversidad();
        usuariosLoad();

    }

    private void usuariosLoad() {
        Services.getUsuarioServices().consultarUsuarios(new AsyncCallback<List<Usuario>>() {
            public void onFailure(Throwable caught) {
                caught.getMessage();
            }

            public void onSuccess(List<Usuario> result) {
                clearResults();
                DataSource ds = usuarioGrid.getDataSource();
                for (int i = 0; i < result.size(); i++) {
                    ds.addData(new UsuarioRecord(result.get(i)));
                }
            }
        });
    }

    private void clearResults() {
        DataSource ds = usuarioGrid.getDataSource();
        for (ListGridRecord record : usuarioGrid.getRecords()) {
            ds.removeData(record);
        }
    }

    public Usuario getUsuario() {
        if (usuario == null) {
            usuario = new Usuario();
        }
        Empresa empresa = cbxempresa.getSelectedRecord().getAttributeAsObject("Empresa") == null ? null : (Empresa) cbxempresa.getSelectedRecord().getAttributeAsObject("Empresa");
        TipoDocumento tipoDocumento = cbxtipoDocumento.getSelectedRecord().getAttributeAsObject("TipoDocumento") == null ? null : (TipoDocumento) cbxtipoDocumento.getSelectedRecord().getAttributeAsObject("TipoDocumento");
        Universidad universidad = cbxuniversidad.getSelectedRecord().getAttributeAsObject("Universidad") == null ? null : (Universidad) cbxuniversidad.getSelectedRecord().getAttributeAsObject("Universidad");
        usuario.setDsapellido1(txtapellido1.getValueAsString());
        usuario.setDsapellido2(txtapellid2.getValueAsString());
        usuario.setDscontrasena(txtcontrasena.getValueAsString());
        usuario.setDscorreo(txtcorreo.getValueAsString());
        usuario.setDsidEmpresa(empresa);
        usuario.setDsidTipoDocumento(tipoDocumento);
        usuario.setDsnombres(txtnombres.getValueAsString());
        usuario.setDstelefonoCelular(txtcelular.getValueAsString());
        usuario.setDstelefonoFijo(txttelefonoFijo.getValueAsString());
        usuario.setFefehchaNacimiento(dtpfechaNacimiento.getValueAsDate());
        usuario.setNmdocumento(txtdocumento.getValueAsString());
        usuario.setNmidUniversidad(universidad);
        return usuario;
    }

    public void cargarUniversidad() {
        Services.getUniversidadServices().consultarUniversidads(new AsyncCallback<List<Universidad>>() {
            public void onFailure(Throwable caught) {
                Logger.getLogger(getClass().getName()).log(Level.INFO, "Mensaje informativo...no se cargaron los cargos de empleados: " + caught.getMessage());
            }

            public void onSuccess(List<Universidad> universidades) {

                for (int i = 0; i < universidades.size(); i++) {
                    universidadDs.addData(new UniversidadRecord(universidades.get(i)));
                }
                cbxuniversidad.setOptionDataSource(universidadDs);
            }
        });
    }

    public void cargarEmpresas() {
        Services.getEmpresaServices().consultarEmpresas(new AsyncCallback<List<Empresa>>() {
            public void onFailure(Throwable caught) {
                Logger.getLogger(getClass().getName()).log(Level.INFO, "Mensaje informativo...no se cargaron los cargos de empleados: " + caught.getMessage());
            }

            public void onSuccess(List<Empresa> empresas) {

                for (int i = 0; i < empresas.size(); i++) {
                    empresaDs.addData(new EmpresaRecord(empresas.get(i)));
                }
                cbxempresa.setOptionDataSource(empresaDs);
            }
        });
    }

    public void cargarTipoDocumento() {
        Services.getTipoDocumentoServices().consultarTipoDocumentos(new AsyncCallback<List<TipoDocumento>>() {
            public void onFailure(Throwable caught) {
                Logger.getLogger(getClass().getName()).log(Level.INFO, "Mensaje informativo...no se cargaron los cargos de empleados: " + caught.getMessage());
            }

            public void onSuccess(List<TipoDocumento> tipoDocumentos) {

                for (int i = 0; i < tipoDocumentos.size(); i++) {
                    tipoDocumentoDs.addData(new TipoDocumentoRecord(tipoDocumentos.get(i)));
                }
                cbxtipoDocumento.setOptionDataSource(tipoDocumentoDs);
            }
        });
    }
}